package ar.edu.utn.frba.disenio;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import ar.edu.utn.frba.disenio.aerolineas.Aerolineas;
import ar.edu.utn.frba.disenio.tipousuarios.TipoUsuario;
 
public class Usuario {
	private Integer dni;
	private String nombre;
	private TipoUsuario tipo;
	private Aerolineas aerolineas;
	private BigDecimal comprasAcumuladas = new BigDecimal(0);
	private Collection<Busqueda> busquedasRealizadas = new ArrayList<Busqueda>();
	private ArrayList<Asiento> operacionesRealizadas = new ArrayList<Asiento>();
	
	public Usuario(Integer dni, String nombre, TipoUsuario tipo,Aerolineas aerolineas){
		this.setDni(dni);
		this.setNombre(nombre);
		this.tipo = tipo;
		this.setAerolineas(aerolineas);
	}

	public Collection<Vuelo> buscarVuelos(Busqueda busqueda)
	{
		this.agregarBusqueda(busqueda);
		return busqueda.buscarVuelos(this.getAerolineas(),this);		
	}
	
	public void reservarVuelo(Vuelo vuelo)
	{
		for(Asiento asiento : vuelo.getAsientos())
		{
			asiento.getAerolinea().reservarAsiento(this,asiento);
			this.getOperacionesRealizadas().add(asiento);
		}
	}
	
	public void sobrereservarVuelo(Vuelo vuelo)
	{
		for(Asiento asiento : vuelo.getAsientos())
		{
			asiento.getAerolinea().sobrereservarAsiento(this,asiento);
			this.getOperacionesRealizadas().add(asiento);
		}
	}
	
	public void comprarVuelo(Vuelo vuelo)
	{
		for(Asiento asiento : vuelo.getAsientos())
		{
			asiento.getAerolinea().comprarAsiento(this,asiento);
			this.getAerolineas().actualizarVuelosComprados(asiento.getCodigoVuelo());
			this.tipo.sumarCompra(this,asiento.getPrecio());
			this.getOperacionesRealizadas().add(asiento);
		}
	}
	
	public void cancelarReserva(Vuelo vuelo)
	{
		for(Asiento asiento : vuelo.getAsientos())
		{
			asiento.getAerolinea().cancelarReserva(asiento, this);
		}
	}
	
	public List<Asiento> obtenerOperaciones(Reservado reservado)
	{
		List<Asiento> subList = new ArrayList<Asiento>();
		for( Asiento asiento : this.operacionesRealizadas)
		{
			if(reservado.equals(Reservado.RESERVADO) && asiento.getReservado())
			{
					subList.add(asiento);
			}
			else if(reservado.equals(Reservado.NO_RESERVADO) && !asiento.getReservado())
			{
					subList.add(asiento);
			}
		}
		return subList;  
	}
	
	public enum Reservado 
	{
		RESERVADO,
		NO_RESERVADO
	}
	
	public boolean puedeComprar(Asiento asiento) {
		return this.tipo.puedeComprar(asiento);
	}

	public void agregarBusqueda(Busqueda busqueda){
		this.getBusquedasRealizadas().add(busqueda);
	}
	
	public void setTipo(TipoUsuario tipo) {
		this.tipo = tipo;
	}
	
	public TipoUsuario getTipo(){
		return this.tipo;
	}
	
	public BigDecimal getComprasAcumuladas() {
		return comprasAcumuladas;
	}
	
	public BigDecimal getAdicionalPorTipo() {
		return this.tipo.getImporteAdicional();
	}

	public void setComprasAcumuladas(BigDecimal comprasAcumuladas) {
		this.comprasAcumuladas = comprasAcumuladas;
	}

	public Collection<Busqueda> getBusquedasRealizadas() {
		return busquedasRealizadas;
	}

	public void setBusquedasRealizadas(Collection<Busqueda> busquedasRealizadas) {
		this.busquedasRealizadas = busquedasRealizadas;
	}

	public Integer getDni() {
		return dni;
	}

	public void setDni(Integer dni) {
		this.dni = dni;
	}

	public Aerolineas getAerolineas() {
		return aerolineas;
	}

	public void setAerolineas(Aerolineas aerolineas) {
		this.aerolineas = aerolineas;
	}

	public ArrayList<Asiento> getOperacionesRealizadas() {
		return operacionesRealizadas;
	}

	public void setOperacionesRealizadas(ArrayList<Asiento> operacionesRealizadas) {
		this.operacionesRealizadas = operacionesRealizadas;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
}